/**
 * 项目管理 API 服务
 * 重构后的主服务器文件
 */

const express = require('express');
const path = require('path');
const cors = require('cors');
const { PORT, PROJECTS_DIR } = require('./utils/constants');
const { getLocalIPAddress } = require('./utils/helpers');
const { encodingFixMiddleware } = require('./middleware/fixEncoding');
const { cleanExpiredRecycleBin, cleanAllProjectCache } = require('./services/projectService');

const app = express();

// ==================== 中间件 ====================

app.use(cors());
app.use(express.json({ limit: '50mb' })); // 🎯 增加JSON body大小限制，支持大场景树数据
app.use(express.urlencoded({ extended: true, limit: '50mb' }));

// 设置API响应头为UTF-8
app.use('/api', (req, res, next) => {
    res.setHeader('Content-Type', 'application/json; charset=utf-8');
    next();
});

// 编码修复中间件 - 自动修复响应数据中的编码问题
app.use('/api', encodingFixMiddleware);

// 静态文件服务 - 提供项目模型文件访问
app.use('/models', express.static(path.join(__dirname, '../projects'), {
    setHeaders: (res, filePath) => {
        res.set('Access-Control-Allow-Origin', '*');
    }
}));

// 为每个项目提供静态文件访问
app.use('/projects', express.static(path.join(__dirname, '../projects'), {
    setHeaders: (res, filePath) => {
        res.set('Access-Control-Allow-Origin', '*');
    }
}));

// ==================== 路由模块 ====================

// 项目管理路由
const projectsRouter = require('./routes/projects.routes');
app.use('/api/projects', projectsRouter);

// 场景管理路由（嵌套在项目路由下）
const scenesRouter = require('./routes/scenes.routes');
app.use('/api/projects/:id/scenes', scenesRouter);

// 模型管理路由（嵌套在项目路由下）
const modelsRouter = require('./routes/models.routes');
app.use('/api/projects/:id/models', modelsRouter);

// 材质管理路由（嵌套在项目路由下）
const materialsRouter = require('./routes/materials.routes');
app.use('/api/projects/:id/materials', materialsRouter);

// 贴图管理路由（嵌套在项目路由下）
const texturesRouter = require('./routes/textures.routes');
app.use('/api/projects/:id/textures', texturesRouter);

// 账户管理路由
const accountsRouter = require('./routes/accounts.routes');
app.use('/api/accounts', accountsRouter);

// 认证路由
const authRouter = require('./routes/auth.routes');
app.use('/api/auth', authRouter);

// 配置管理路由
const configRouter = require('./routes/config.routes');
app.use('/api/config', configRouter);

// 缓存管理路由
const cacheRouter = require('./routes/cache.routes');
app.use('/api/cache', cacheRouter);

// 资源管理路由（资源依赖分析和使用率统计）
const resourcesRouter = require('./routes/resources.routes');
app.use('/api/resources', resourcesRouter);

// ==================== 健康检查 ====================

app.get('/health', (req, res) => {
    res.json({
        success: true,
        message: 'Server is running',
        timestamp: new Date().toISOString()
    });
});

// ==================== 定时任务 ====================

/**
 * 回收站自动清理任务
 * 每天凌晨2点执行，清理30天前的过期项目
 */
function scheduleRecycleBinCleanup() {
    // 计算到下一个凌晨2点的时间
    function getNextCleanupTime() {
        const now = new Date();
        const next = new Date(now);
        next.setHours(2, 0, 0, 0);
        
        // 如果今天的2点已经过了，设置为明天的2点
        if (next <= now) {
            next.setDate(next.getDate() + 1);
        }
        
        return next.getTime() - now.getTime();
    }
    
    // 执行清理任务
    async function runCleanup() {
        try {
            console.log('\n🧹 开始执行回收站自动清理任务...');
            const result = await cleanExpiredRecycleBin();
            
            if (result.cleaned > 0) {
                console.log(`✅ 回收站清理完成：已删除 ${result.cleaned} 个过期项目`);
                result.projects.forEach(p => {
                    console.log(`   - ${p.name} (${p.id})`);
                });
            } else {
                console.log('✅ 回收站清理完成：没有过期项目需要删除');
            }
        } catch (error) {
            console.error('❌ 回收站清理任务失败:', error);
        }
        
        // 安排下一次清理
        const nextTime = getNextCleanupTime();
        setTimeout(runCleanup, nextTime);
        const nextDate = new Date(Date.now() + nextTime);
        console.log(`⏰ 下次清理时间: ${nextDate.toLocaleString('zh-CN')}\n`);
    }
    
    // 启动时立即执行一次清理
    runCleanup();
}

// ==================== 启动服务器 ====================

const localIP = getLocalIPAddress();

app.listen(PORT, '0.0.0.0', async () => {
    console.log('\n╔════════════════════════════════════════════════════════╗');
    console.log('║                                                        ║');
    console.log('║        🚀 项目管理 API 服务已启动！                   ║');
    console.log('║                                                        ║');
    console.log('╚════════════════════════════════════════════════════════╝\n');
    console.log(`  📡 本地访问:    http://localhost:${PORT}`);
    console.log(`  🌐 局域网访问:  http://${localIP}:${PORT}`);
    console.log('\n══════════════════════════════════════════════════════════\n');
    
    // 清理所有项目缓存
    console.log('🧹 正在清理项目缓存...');
    await cleanAllProjectCache();
    console.log('');
    
    // 启动回收站自动清理任务
    scheduleRecycleBinCleanup();
});

// 优雅关闭
process.on('SIGTERM', async () => {
    console.log('\n⚠️  收到 SIGTERM 信号，正在优雅关闭服务器...');
    console.log('🧹 正在清理项目缓存...');
    await cleanAllProjectCache();
    console.log('✅ 服务器已安全关闭\n');
    process.exit(0);
});

process.on('SIGINT', async () => {
    console.log('\n⚠️  收到 SIGINT 信号，正在优雅关闭服务器...');
    console.log('🧹 正在清理项目缓存...');
    await cleanAllProjectCache();
    console.log('✅ 服务器已安全关闭\n');
    process.exit(0);
});
